home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / msqc25t1 / filemisc.c < prev    next >
C/C++ Source or Header  |  1990-09-06  |  3KB  |  130 lines

  1. /* Library FILEMISC.C: Miscellaneous file service function that extend QC */
  2.  
  3. #include <errno.h>
  4. #include <dos.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include "filemisc.h"
  9.  
  10. /*
  11.  
  12. _chmod(): Stretched version of Quick C chmod function
  13. Changes a named file to any attribute except label and directory.
  14. Returns 0 if successful, -1 if not, and set global variable
  15.     errno when unsuccessful.
  16. */
  17.  
  18.  
  19. int _chmod (char far *path, int new_attrib)
  20. {
  21. union REGS  inreg, outreg;
  22. struct SREGS sreg;
  23. int     retval = 0;
  24.  
  25.     inreg.h.ah = 0x43;      /* Int 21h, fcn 43h */
  26.     inreg.h.al = 0x01;      /* set file attrib */
  27.     inreg.x.cx = new_attrib;    /* attrib to set */
  28.     inreg.x.dx = FP_OFF (path); /* point to file path
  29.     sreg.ds    = FP_SEG (path);
  30.     int86x (0x21, &inreg, &outreg, &sreg);  /* call dos */
  31.  
  32.     switch (outreg.x.ax) {
  33.         case 1: errno = EINVAL;     /* invalid function call */
  34.             retval = -1;
  35.             break;
  36.         case 2:                     /* file not found */
  37.         case 3: errno = ENOENT;     /* bad path or filename */
  38.             retval = -1;
  39.             break;
  40.         case 5: errno = EACCES;     /* cannot change attrib */
  41.             retval = -1;
  42.             break;
  43.         default: errno = 0;         /* else no error */
  44.     }
  45.     return (retval);
  46. }
  47.  
  48. /*
  49.  
  50. timestamp(): Converts the DOS file time stamp into:
  51.     1. A formatted string of 12 chars (hh:mm:ss ?m)
  52.     2. Its hour, min, and sec numric components
  53. For any component not to be converted, pass NULL arg
  54.  
  55. */
  56.  
  57. void timestamp (unsigned field,
  58.                 char *string, unsigned *hour,
  59.                 unsigned *min, unsigned *sec)
  60. {
  61.     struct TSTAMP {     /* time stamp bitfield */
  62.         unsigned sec  : 5,
  63.             min   : 6,
  64.             hour  : 5;
  65.     };
  66.     union {
  67.         struct TSTAMP stamp;
  68.         unsigned    ftime;
  69.     } time;
  70.     char ap[3];
  71.     int h, m, s;
  72.  
  73.     strcpy (ap, "am");
  74.     time.ftime = field;
  75.     if (time.stamp.hour >23)    /* get hour */
  76.         h = 0;
  77.     else
  78.         if (time.stamp.hour > 11) {
  79.             h = time.stamp.hour - 12;
  80.             ap[0] = 'p';
  81.         } else
  82.             h = time.stamp.hour;
  83.     m = time.stamp.min;             /* get minute */
  84.     s = time.stamp.sec * 2;         /* get seconds */
  85.     if (string)             /* convert time to text string */
  86.         sprintf (string, "%02d:%02d:%02d %s", h, m, s, ap);
  87.     if (hour) *hour = h;
  88.     if (min)  *min = m;
  89.     if (sec)  *sec = s;
  90. }
  91.  
  92.  
  93. /*
  94.  
  95. datestamp(): Converts the DOS file date stamp into:
  96.     1. A formatted string of 11 chars (mm/dd/yyyy)
  97.     2. Its month, day, and year numeric components
  98. For any component not to be converted, pass NULL arg
  99.  
  100. */
  101.  
  102. void datestamp( unsigned field,
  103.     char *string, unsigned *year,
  104.     unsigned *month, unsigned *day)
  105. {
  106.     struct DSTAMP {     /* date stamp bitfield format */
  107.         unsigned day    : 5,
  108.             month  : 4,
  109.             year   : 7;
  110.     };
  111.  
  112.     union {
  113.         struct DSTAMP stamp;
  114.         unsigned    fdate;
  115.     } date;
  116.     unsigned d, m, y;
  117.  
  118.         date.fdate = field;
  119.         y = date.stamp.year + 1980;
  120.         m = date.stamp.month;
  121.         d = date.stamp.day;
  122.         if (string)
  123.             sprintf (string, "%02d/%02d/%02d", m, d, y);
  124.         if (year) *year = y;
  125.         if (month) *month = m;
  126.         if (day)  *day   = d;
  127. }
  128.  
  129.  
  130.